﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;
using System.Drawing;

namespace System.Windows.Forms.Design;

/// <summary>
///  This interface allows a designer to provide information to the selection UI
///  service that is needed to allow it to draw selection UI and to provide
///  automatic component drag support.
/// </summary>
internal interface ISelectionUIHandler
{
    /// <summary>
    ///  Begins a drag on the currently selected designer. The designer should provide
    ///  UI feedback about the drag at this time. Typically, this feedback consists
    ///  of an inverted rectangle for each component, or a caret if the component
    ///  is text.
    /// </summary>
    bool BeginDrag(object[] components, SelectionRules rules, int initialX, int initialY);

    /// <summary>
    ///  Called when the user has moved the mouse. This will only be called on
    ///  the designer that returned true from beginDrag. The designer
    ///  should update its UI feedback here.
    /// </summary>
    void DragMoved(object[] components, Rectangle offset);

    /// <summary>
    ///  Called when the user has completed the drag. The designer should
    ///  remove any UI feedback it may be providing.
    /// </summary>
    void EndDrag(object[] components, bool cancel);

    /// <summary>
    ///  Retrieves the shape of the component. The component's shape should be in
    ///  absolute coordinates and in pixels, where 0,0 is the upper left corner of
    ///  the screen.
    /// </summary>
    Rectangle GetComponentBounds(object component);

    /// <summary>
    ///  Retrieves a set of rules concerning the movement capabilities of a component.
    ///  This should be one or more flags from the SelectionRules class. If no designer
    ///  provides rules for a component, the component will not get any UI services.
    /// </summary>
    SelectionRules GetComponentRules(object component);

    /// <summary>
    ///  Determines the rectangle that any selection adornments should be clipped
    ///  to. This is normally the client area (in screen coordinates) of the
    ///  container.
    /// </summary>
    Rectangle GetSelectionClipRect(object component);

    /// <summary>
    ///  Handle a double-click on the selection rectangle
    ///  of the given component.
    /// </summary>
    void OnSelectionDoubleClick(IComponent component);

    /// <summary>
    ///  Queries to see if a drag operation
    ///  is valid on this handler for the given set of components.
    ///  If it returns true, BeginDrag will be called immediately after.
    /// </summary>
    bool QueryBeginDrag(object[] components, SelectionRules rules, int initialX, int initialY);

    /// <summary>
    ///  Shows the context menu for the given component.
    /// </summary>
    void ShowContextMenu(IComponent component);

    void OleDragEnter(DragEventArgs de);
    void OleDragDrop(DragEventArgs de);
    void OleDragOver(DragEventArgs de);
    void OleDragLeave();
}
